#使用Makefile的优势：1.命令简单，不用长串的g++命令 2. 编译效率高，不用重复编译没有修改过的文件
#原来的长命令是：gcc main.c rcv_from_server.c send_to_server.c ./APP/debugLog.c map_parse.c -o clienttest -lpthread
#设置编译器
CC = gcc
#设置最终目标
TARGET = client_test

#设置源文件(可用 *.c 但是这里必须除去 test.cpp,因此我罗列出来)
C_SOURCE += ./*.c
C_SOURCE += ./APP/debugLog.c

#设置头文件路径
INCLUDE_PATH += -I ./ ./APP

#设置库文件路径 (这里没用到另外的非系统的库，因此注释掉)
#LIBRARY_PATH += -L ./
#设置库名
LIB += -lpthread


#方式3：放在单独的目录、设置目标文件
#从下面代码可以看出，主要是使用了 makefile 的特定函数
OBJ_DIR := build
#写错函数名、函数参数(%.c 和 %.o前的/) C_OBJECT := $(patsbust %.c, $(OBJ_DIR)%.o, $(notdir $(C_SOURCE)))
#这里写错，感觉Makefile就像汇编一样，函数样式(函数没函数的样子，和变量混杂在一起）实在不好人眼看，很容易出错。
#教程写法还包括 notdir函数 和 SRC_DIR变量, C_OBJECT := $(patsubst %.cpp, $(OBJ_DIR)/%.o, $(notdir SRC_DIR(C_SOURCE)))
C_OBJECT := $(patsubst %.c, $(OBJ_DIR)/%.o, $(notdir $(C_SOURCE)))

$(OBJ_DIR)/$(TARGET):$(C_OBJECT)
	$(CC) -o $@ $^ $(INCLUDE_PATH) $(LIB)

#教程写法还包括 SRC_DIR 变量，$(BUILD_DIR)/%.o: $(SRC_DIR)/%.c $(DEPS)
#$(OBJ_DIR)/%.o:%.cpp
#	mkdir -p $(OBJ_DIR)
#	$(CC) -c -o $@ $<

#上面这种写法：当.h文件改变的时候，不能更新
#方式4：
INCLUDE_FILE += ./*.h
INCLUDE_FILE += ./APP/debugLog.h

#这里.o 的依赖增加了.h文件
$(OBJ_DIR)/%.o:%.c $(INCLUDE_FILE)
	mkdir -p $(OBJ_DIR)
	$(CC) -c -o $@ $<



#伪目标——防止存在clean文件，从而使得rm无法执行。目的是区别生成文件的相关命令
.PHONY: clean
clean:
	rm *.o
	rm $(TARGET)

.PHONY: cleanobj
cleanobj:
	rm *.o

